package com.zjsru.plan2025.oneday;

/**
 * 2680. 最大或值
 *
 * @Author: cookLee
 * @Date: 2025-03-21
 */
public class MaximumOr {

    /**
     * 主
     * \
     * 输入：nums = [12,9], k = 1
     * 输出：30
     * 解释：如果我们对下标为 1 的元素进行操作，新的数组为 [12,18] 。此时得到最优答案为 12 和 18 的按位或运算的结果，也就是 30 。
     * \
     * 输入：nums = [8,1,2], k = 2
     * 输出：35
     * 解释：如果我们对下标 0 处的元素进行操作，得到新数组 [32,1,2] 。此时得到最优答案为 32|1|2 = 35 。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        MaximumOr maximumOr = new MaximumOr();
        int[] nums = new int[]{12, 9};
        int k = 2;
        System.out.println(maximumOr.maximumOr(nums, k));
    }

    public long maximumOr(int[] nums, int k) {
        int len = nums.length;
        long[] suf = new long[len + 1];
        for (int i = len - 1; i >= 0; i--) {
            suf[i] = suf[i + 1] | nums[i];
        }
        long ans = 0;
        long pre = 0;
        for (int i = 0; i < len; i++) {
            ans = Math.max(ans, pre | ((long) nums[i] << k) | suf[i + 1]);
            pre = pre | nums[i];
        }
        return ans;
    }

}
